﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace FlyingCircusWebIS.Models
{
    public class CupomService: ICupomService
    {

        private ICupomDAO cupomDAO;
        private IReservaDAO reservaDAO;

        public CupomService()
        {
            cupomDAO = new CupomDAO();
            reservaDAO = new ReservaDAO();
        }

        public void Atualizar(Cupom entidade)
        {
            cupomDAO.Atualizar(entidade);
        }

        public void Adicionar(Cupom entidade)
        {
            cupomDAO.Adicionar(entidade);
        }

        public List<Cupom> Listar()
        {
            return cupomDAO.Listar();
        }

        public List<Cupom> ListarAtivos()
        {
            return cupomDAO.Listar().FindAll(c => c.FlagAtivo.Equals("S"));
        }

        public Cupom BuscarPorCodCupom(string codigo)
        {
            return cupomDAO.BuscarPorCodCupom(codigo);
        }

        public Cupom BuscarPorCodCupomAtivo(string codigo)
        {
            Cupom registro = cupomDAO.BuscarPorCodCupom(codigo);
            if (registro != null && registro.FlagAtivo.Equals("S"))
                return registro;
            else
                return null;
        }

        public Cupom BuscarPorNome(string nome)
        {
            Cupom cupom = null;
            cupom = cupomDAO.Listar().Find(e => e.NomeCupom.Equals(nome, StringComparison.InvariantCultureIgnoreCase));
            
            return cupom;
        }

        public Cupom BuscarPorNomeAtivo(string nome)
        {
            Cupom cupom = cupomDAO.Listar().Find(e => e.NomeCupom.Equals(nome, StringComparison.InvariantCultureIgnoreCase) 
                                                    && e.FlagAtivo.Equals("S"));
            return cupom;
        }

        public void DesativarPorCodCupom(string codigo)
        {
            cupomDAO.DesativarPorCodCupom(codigo);
        }

        public void AtivarPorCodCupom(string codigo)
        {
            cupomDAO.AtivarPorCodCupom(codigo);
        }


        public List<ValidationResult> ValidarEntidade(Cupom entidade, bool edicao)
        {
            List<ValidationResult> erros = new List<ValidationResult>();

            if (edicao)
            {
                List<ValidationResult> errosAtualizar = ValidaAtualizar(entidade);
                if (errosAtualizar != null)
                    erros.AddRange(errosAtualizar);
            }
            else
            {
                List<ValidationResult> errosAdicionar = ValidaAdicionar(entidade);
                if (errosAdicionar != null)
                    erros.AddRange(errosAdicionar);
            }

            return erros;
        }

        public List<ValidationResult> ValidaAdicionar(Cupom entidade)
        {
            List<ValidationResult> erros = new List<ValidationResult>();

            bool existeNome = cupomDAO.Listar().Any(e => e.NomeCupom.Equals(entidade.NomeCupom, StringComparison.InvariantCultureIgnoreCase));
            if (existeNome)
                erros.Add(new ValidationResult("Já existe um registro com o nome informado."));

            bool existeCod = cupomDAO.Listar().Any(e => e.CodCupom.Equals(entidade.CodCupom, StringComparison.InvariantCultureIgnoreCase));
            if (existeCod)
                erros.Add(new ValidationResult("Já existe um registro com o código informado."));


            return erros;
        }

        public List<ValidationResult> ValidaAtualizar(Cupom entidade)
        {
            List<ValidationResult> erros = new List<ValidationResult>();

            bool existeNome = cupomDAO.Listar().Any(e => e.NomeCupom.Equals(entidade.NomeCupom, StringComparison.InvariantCultureIgnoreCase)
                                                    && !e.CodCupom.Equals(entidade.CodCupom));
            if (existeNome)
                erros.Add(new ValidationResult("Já existe um registro com o nome informado."));

            bool existeCod = cupomDAO.Listar().Any(e => e.CodCupom.Equals(entidade.CodCupom, StringComparison.InvariantCultureIgnoreCase)
                                                    && !e.CodCupom.Equals(entidade.CodCupom));
            if (existeCod)
                erros.Add(new ValidationResult("Já existe um registro com o código informado."));


            return erros;
        }


        public List<ValidationResult> ValidaRemoverPorCodCupom(string codigo)
        {
            List<ValidationResult> erros = new List<ValidationResult>();

            bool temDependencia = reservaDAO.Listar().Any(e => e.CodCupom.Equals(codigo, StringComparison.InvariantCultureIgnoreCase));
            if (temDependencia)
                erros.Add(new ValidationResult("Dependencia", "O registro tem dependência em outro contexto."));

            return erros;
        }

        public void RemoverPorCodCupom(string codigo)
        {
            cupomDAO.RemoverPorCodCupom(codigo);
        }


        public List<Cupom> ListarFiltro(string nome, string ativo)
        {
            List<Cupom> encontrados = cupomDAO.Listar().FindAll(c => 
                c.NomeCupom.StartsWith(nome, StringComparison.InvariantCultureIgnoreCase) &&
                c.FlagAtivo.StartsWith(ativo, StringComparison.InvariantCultureIgnoreCase));

            return encontrados;
        }
    }
}